package xserver;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import xgame.AbstractXcommand;
import xgame.AbstractXhandler;
import xgame.IXglobalHandler;
import xgame.IXmoduleT;
import xgame.XcommandXhandlerPair;

/**
 * 模板管理器
 * 
 * @author AfritXia
 * @version $Rev: 17 $
 *
 */
public final class XmoduleTManager {
	/**
	 * 全局处理器集合
	 * 
	 */
	private static Collection<IXglobalHandler> _globalHandlerColl = null;

	/**
	 * 命令处理器字典
	 * 
	 */
	private static Map<Integer, XcommandXhandlerPair> _cmdhandlerMap = null;

	static {
		synchronized (XmoduleTManager.class) {
			// 初始化全局处理器集合
			_globalHandlerColl = new ArrayList<IXglobalHandler>();
			// 初始化命令处理器字典
			_cmdhandlerMap = new HashMap<Integer, XcommandXhandlerPair>();
		}
	}

	/**
	 * 类默认构造器
	 * 
	 */
	private XmoduleTManager() {
	}

	/**
	 * 注册游戏模板
	 * 
	 * @param moduleT 
	 * 
	 */
	public static void register(IXmoduleT moduleT) {
		if (moduleT == null) {
			return;
		}

		// 获取全局处理器
		IXglobalHandler h = moduleT.getGlobalHandler();
		// 获取命令处理器字典
		Map<Integer, XcommandXhandlerPair> map = moduleT.getCommandHandlerMap();
		
		if (h != null) {
			_globalHandlerColl.add(h);
		}

		if (map != null) {
			_cmdhandlerMap.putAll(map);
		}
	}

	/**
	 * 获取命令处理器
	 * 
	 * @param cmdId
	 * @return 
	 * 
	 */
	public static XcommandXhandlerPair getCommandHandlerPair(int cmdId) {
		if (cmdId <= 0) {
			return null;
		}

		return _cmdhandlerMap.get(cmdId);
	}

	/**
	 * 获取命令对象
	 * 
	 * @param cmdId
	 * @return 
	 * 
	 */
	public static AbstractXcommand getCommand(int cmdId) {
		// 获取命令处理器结对
		XcommandXhandlerPair pair = getCommandHandlerPair(cmdId);

		if (pair == null) {
			return null;
		} else {
			return pair.getCommand();
		}
	}

	/**
	 * 获取处理器
	 * 
	 * @param cmdId
	 * @return 
	 * 
	 */
	public static AbstractXhandler<? extends AbstractXcommand> getHandler(int cmdId) {
		// 获取命令处理器结对
		XcommandXhandlerPair pair = getCommandHandlerPair(cmdId);

		if (pair == null) {
			return null;
		} else {
			return pair.getHandler();
		}
	}
}
